# -*- coding:UTF-8 -*-
'''
Created on 2013-6-7

@author: hanjiewu
'''
# threading
'''
    Thread 表示一个线程的执行的对象
Lock 锁原语对象（跟thread 模块里的锁对象相同）
RLock 可重入锁对象。使单线程可以再次获得已经获得了的锁（递归锁定）。
Condition 条件变量对象能让一个线程停下来，等待其它线程满足了某个“条件”。
如，状态的改变或值的改变。
Event 通用的条件变量。多个线程可以等待某个事件的发生，在事件发生后，
所有的线程都会被激活。
Semaphore 为等待锁的线程提供一个类似“等候室”的结构
BoundedSemaphore 与Semaphore 类似，只是它不允许超过初始值
Timer 与Thread 相似，只是，它要等待一段时间后才开始运行。
'''
import threading
from time import sleep, ctime

loops = [ 4, 2]
class ThreadFunc(object):
    def __init__(self, func, args, name=''):
        self.name = name
        self.func = func
        self.args = args
    def __call__(self):
        apply(self.func, self.args)

def loop(nloop, nsec):
    print 'start loop', nloop, 'at: ', ctime()
    sleep(nsec)
    print 'loop', nloop, 'done at: ' , ctime()

def main():
    print 'starting at: ', ctime()
    threads = []
    nloops = range(len(loops))
    
    for i in nloops:
        t = threading.Thread(target=ThreadFunc(loop, (i, loops[i]), loop.__name__))
        threads.append(t)
    for i in nloops:
        threads[i].start()
    for i in nloops:
        threads[i].join()
    print 'all DONE at: ', ctime()

class MyThread(threading.Thread):
    def __init__(self, func, args, name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args
    
    def getResult(self):
        return self.res
    def run(self):
        print 'starting', self.name, 'at: ',\
        ctime()
        self.res = apply(self.func, self.args)
        print self.name, 'finish at: ', ctime()
    

if __name__  == '__main__':
    main()
